// 属于用户信息的切片 reducer  初始状态 action 异步操作

import { createSlice } from "@reduxjs/toolkit"

import { setToken, getToken, clearToken } from "@/utils/auth"
import http from "@/utils/http"
// 方法来创建切片

export const userInfoSlice = createSlice({
  name: "userinfo", // 切片名称
  // 初始状态
  initialState: {
    //
    token: getToken(), // 默认值token为空
    profile: {}, // 初始用户资料为一个空对象
  },
  reducers: {
    //   函数集- 对当前的状态进行修改-不需要再次返回新对象了 immer
    updateToken(state, action) {
      state.token = action.payload // RTK最大的特征就是可以直接修改数据
      setToken(action.payload) // 将token同步到本地缓存
    },
    removeToken(state) {
      state.token = null // 直接删除token
      clearToken() // 清除本地缓存
    },
    updateProfile(state, action) {
      state.profile = action.payload
    },
  },
})

export const { updateToken, removeToken, updateProfile } = userInfoSlice.actions // RTK自动生成的actionCreator

// 异步的action- RTK是集成thunk的

export const loginAysnc = (data) => {
  return async (dispatch) => {
    // 异步操作
    const { token } = await http.post("/authorizations", data)
    dispatch(updateToken(token)) // 将redux中的token更新
  }
}
// thunk action
export const getUserProfile = () => {
  return async (dispatch) => {
    // 调用接口 - 获取用户个人资料
    const data = await http.get("/user/profile")
    // 将data更新到redux中
    dispatch(updateProfile(data))
  }
}

// 封装一个 退出的thunkaction

export const logoutAsync = () => {
  return (dispatch) => {
    dispatch(removeToken())
    // 这里的操作其实是同步
    // 因为其他系统中有可能有异步操作-后续扩展比较容易
  }
}
